<?php
if ( ! defined('ROOT')) exit('No direct script access allowed');

/**
 * 系统主文件
 * @author gzute
 * @link http://www.gzute.com
 */
defined('VERSION') or define('VERSION','v1.0'); //系统版本
defined('LIB_PATH') or define('LIB_PATH', ROOT.'libs/'); //类库路径

//系统开始时间
define('SYS_START_TIME', microtime());

//加载系统函数
Base::load_sys_func('constants');
Base::load_sys_func('common');
Base::load_sys_func('global');
$UTF8 = Base::load_sys_class('utf8');

define('CHARSET' ,Base::load_config('system','charset'));
//输出页面字符集
header('Content-type: text/html; charset='.CHARSET);

//网站域名定向
defined('APPURL') or define('APPURL', base_url()); 

if ( ! is_php('5.3')){
   @set_magic_quotes_runtime(0); // Kill magic quotes
}

//时区设置
$timezone = Base::load_config('config','timezone','PRC');
if(function_exists('date_default_timezone_set')) 
{    
	@date_default_timezone_set($timezone);  
}

if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
{
	@set_time_limit(300);
}
        
class Base {
	
	public static function run()
	{
		return self::load_sys_class('application');
	}
	
	/**
	 * 加载系统类方法
	 * @param string $classname 类名
	 * @param string $path 扩展地址
	 * @param intger $initialize 是否初始化
	 */
	public static function load_sys_class($classname, $path = '', $initialize = 1, $params = '') {
		return self::_load_class($classname, $path, $initialize, $params);
	}
	
	
	public static function load_db_class($classname, $path = '')
	{
		$init_path = LIB_PATH.'classes'.DIRECTORY_SEPARATOR.'database';
		if($path != '')
		{
			$init_path .= DIRECTORY_SEPARATOR.'drivers'.DIRECTORY_SEPARATOR.$path;
		}
		$db_file = $init_path.DIRECTORY_SEPARATOR.$classname.'.class.php';
		if(class_exists(ucfirst($classname)))
		{
			return true;
		}
		if(file_exists($db_file))
		{
			include_once $db_file;
		}
	}
	
	/**
	 * 加载类文件函数
	 * @param string $classname 类名
	 * @param string $path 扩展地址
	 * @param intger $initialize 是否初始化
	 */
	public static function _load_class($classname, $path = '', $initialize = 1, $params = '')
	{
		static $classes = array();
		$path = (empty($path) || $path == '') ? 'classes' : $path ;
		$path .= DIRECTORY_SEPARATOR;
		$key = md5($path.$classname);
		if(isset($classes[$key]))
		{
			return $classes[$key];
		}else {
			if(file_exists(LIB_PATH.$path.$classname.'.class.php'))
			{
				include LIB_PATH.$path.$classname.'.class.php';
				$name = ucfirst($classname);
				if($initialize && class_exists($name))
				{
					$classes[$key] = new $name;
					
					/*判断是否存在初始化方法:initialize*/
					if(method_exists($classes[$key], 'initialize'))
					{
						//初始化时需要用到的类函数
						$classes[$key]->initialize($params); 
					}
				}else {
					//已经包含文件，但不初始化，返回包含结果true
					$classes[$key] = true;
				}
			}
			return $classes[$key];
		}
	}
	
	/**
	 * 加载系统的函数库
	 * @param string $func 函数库名
	 */
	public static function load_sys_func($func) {
		return self::_load_func($func);
	}
	
	/**
	 * 加载函数库
	 * @param string $func 函数库名
	 * @param string $path 地址
	 */
	private static function _load_func($func, $path = '') {
		static $funcs = array();
		if (empty($path)) $path = 'functions';
		$path .= DIRECTORY_SEPARATOR;
		$path .= $func.'.func.php';
		$key = md5($path);
		if (isset($funcs[$key])) return true;
		if (file_exists(LIB_PATH.$path)) {
			include LIB_PATH.$path;
		} else {
			$funcs[$key] = false;
			return false;
		}
		$funcs[$key] = true;
		return true;
	}
	
	/**
	 * 加载配置文件
	 * @param string $file 配置文件
	 * @param string $key  要获取的配置荐
	 * @param string $default  默认配置。当获取配置项目失败时该值发生作用。
	 * @param boolean $reload 强制重新加载。
	 */
	public static function load_config($file, $key = '', $default = '', $reload = false) {
		static $configs = array();
		if (!$reload && isset($configs[$file])) {
			if (empty($key)) {
				return $configs[$file];
			} elseif (isset($configs[$file][$key])) {
				return $configs[$file][$key];
			} else {
				return $default;
			}
		}
		$path = LIB_PATH.'configs'.DIRECTORY_SEPARATOR.$file.'.php';
		if (file_exists($path)) {
			$configs[$file] = include $path;
		}
		
		if (empty($key)) {
			return $configs[$file];
		} elseif (isset($configs[$file][$key])) {
			return $configs[$file][$key];
		} else {
			return $default;
		}
	}
	
	/**
	 * 加载应用类方法
	 * @param string $classname 类名
	 * @param string $m 模块
	 * @param intger $initialize 是否初始化
	 */
	public static function load_app_class($classname, $m = '', $initialize = 1) {
		if (empty($m)) $m = Base::load_sys_class('router')->get_module();
		return self::_load_class($classname, 'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'classes', $initialize);
	}
	
	/**
	 * 加载应用函数库
	 * @param string $func 函数库名
	 * @param string $m 模型名
	 */
	public static function load_app_func($func, $m = '') {
		if (empty($m)) $m = Base::load_sys_class('router')->get_module();
		return self::_load_func($func, 'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'functions');
	}
	
	/**
	 * 加载数据模型
	 * @param string $classname 类名
	 */
	public static function load_model($classname, $params = '') {
		return self::_load_class($classname.'Model','models',1,$params);
	}
	 
}

//end of this file
